import numpy as np
import matplotlib.pyplot as plt


def sep(label=''):
    print('-' * 32, label, '-' * 32, sep='')


spr = 1
spc = 2
spn = 0
plt.figure(figsize=[16, 8])

# 对以下数据进行处理，了解逻辑回归特性
# 1.	数据创建
# a)	[1, 1, 0], [1, 2, 0], [0, 0, 1], [-1, 0, 1] 将数据进行存储（10分）
data = np.array([[1, 1, 0], [1, 2, 0], [0, 0, 1], [-1, 0, 1]],
                dtype=np.float64)

# b)	数据最后一个数值为y，其余数值为x（10分）
x = data[:, :-1]
y = data[:, -1]
spn += 1
plt.subplot(spr, spc, spn)
plt.scatter(x[:, 0] ,x[:, 1], c=y)

# 2.	模型创建
# a)	创建逻辑回归（15分）
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='liblinear')

# b)	拟合数据（10分）
model.fit(x, y)
print(f'Score = {model.score(x, y)}')

# c)	打印预测结果（10分）
sep('打印预测结果')
h = model.predict(x)
print(h)

# d)	打印每个样本各类别概率（15分）
sep('打印每个样本各类别概率')
proba = model.predict_proba(x)
print(proba)

# e)	打印截距（10分）
sep('打印截距')
print(model.intercept_)

# f)	打印权重（10分）
sep('打印权重')
print(model.coef_)


# g)	说明逻辑回归概率和边界线之间的关系（10分）
def x2y(x, coef, inter):
    return - (inter + coef[0][0]*x) / coef[0][1]


plt_x = np.array([x[:, 0].min(), x[:, 0].max()])
plt_y = x2y(plt_x, model.coef_, model.intercept_)
plt.plot(plt_x, plt_y, 'r--')

# roc curve
from sklearn.metrics import roc_curve, roc_auc_score
print(f'roc auc score = {roc_auc_score(y, proba[:, 1])}')
fpr, tpr, thre = roc_curve(y, proba[:, 1])
spn += 1
plt.subplot(spr, spc, spn)
plt.plot(fpr, tpr)
for i, th in enumerate(thre):
    plt.annotate(f'{th:.2f}', xy=(fpr[i], tpr[i]))

# finally show all drawings
plt.show()
